package com.example.chamberlainserver.Service;

import com.example.chamberlainserver.Entry.CounselorClass;
import com.example.chamberlainserver.dto.CounselorClassDTO;
import com.example.chamberlainserver.dto.PageResult;

import java.util.List;

/**
 * 辅导员班级关联服务接口
 */
public interface CounselorClassService {

    /**
     * 查询所有关联关系
     * @return 关联关系列表
     */
    List<CounselorClass> getAllCounselorClasses();

    /**
     * 根据ID查询关联关系
     * @param id 关联关系ID
     * @return 关联关系信息
     */
    CounselorClass getCounselorClassById(Long id);

    /**
     * 根据辅导员ID查询关联关系
     * @param counselorId 辅导员ID
     * @return 关联关系列表
     */
    List<CounselorClass> getCounselorClassesByCounselorId(Long counselorId);

    /**
     * 根据班级ID查询关联关系
     * @param classId 班级ID
     * @return 关联关系列表
     */
    List<CounselorClass> getCounselorClassesByClassId(Long classId);

    /**
     * 查询特定辅导员和班级的关联关系
     * @param counselorId 辅导员ID
     * @param classId 班级ID
     * @return 关联关系信息
     */
    CounselorClass getCounselorClassByCounselorAndClass(Long counselorId, Long classId);

    /**
     * 分页查询关联关系（带详细信息）
     * @param page 页码
     * @param size 每页大小
     * @param counselorName 辅导员姓名（可选）
     * @param className 班级名称（可选）
     * @param department 部门（可选）
     * @return 分页结果
     */
    PageResult<CounselorClass> getCounselorClassesByPageWithDetails(int page, int size, 
                                                                   String counselorName, 
                                                                   String className, 
                                                                   String department);

    /**
     * 创建关联关系
     * @param counselorClassDTO 关联关系信息
     * @return 创建的关联关系
     */
    CounselorClass createCounselorClass(CounselorClassDTO counselorClassDTO);

    /**
     * 批量创建关联关系
     * @param counselorClassDTOs 关联关系信息列表
     * @return 创建成功的数量
     */
    int createCounselorClasses(List<CounselorClassDTO> counselorClassDTOs);

    /**
     * 更新关联关系
     * @param id 关联关系ID
     * @param counselorClassDTO 更新的关联关系信息
     * @return 更新后的关联关系
     */
    CounselorClass updateCounselorClass(Long id, CounselorClassDTO counselorClassDTO);

    /**
     * 删除关联关系
     * @param id 关联关系ID
     * @return 是否删除成功
     */
    boolean deleteCounselorClass(Long id);

    /**
     * 根据辅导员ID删除关联关系
     * @param counselorId 辅导员ID
     * @return 删除成功的数量
     */
    int deleteCounselorClassesByCounselorId(Long counselorId);

    /**
     * 根据班级ID删除关联关系
     * @param classId 班级ID
     * @return 删除成功的数量
     */
    int deleteCounselorClassesByClassId(Long classId);

    /**
     * 删除特定辅导员和班级的关联关系
     * @param counselorId 辅导员ID
     * @param classId 班级ID
     * @return 是否删除成功
     */
    boolean deleteCounselorClassByCounselorAndClass(Long counselorId, Long classId);

    /**
     * 批量删除关联关系
     * @param ids 关联关系ID列表
     * @return 删除成功的数量
     */
    int deleteCounselorClasses(List<Long> ids);

    /**
     * 设置主要负责辅导员
     * @param counselorId 辅导员ID
     * @param classId 班级ID
     * @return 是否设置成功
     */
    boolean setPrimaryCounselor(Long counselorId, Long classId);

    /**
     * 取消班级的主要负责辅导员
     * @param classId 班级ID
     * @return 是否取消成功
     */
    boolean clearPrimaryCounselor(Long classId);

    /**
     * 批量分配辅导员到班级
     * @param counselorId 辅导员ID
     * @param classIds 班级ID列表
     * @param isPrimary 是否为主要负责辅导员
     * @return 分配成功的数量
     */
    int assignCounselorToClasses(Long counselorId, List<Long> classIds, boolean isPrimary);

    /**
     * 批量分配班级到辅导员
     * @param classId 班级ID
     * @param counselorIds 辅导员ID列表
     * @param primaryCounselorId 主要负责辅导员ID（可选）
     * @return 分配成功的数量
     */
    int assignClassToCounselors(Long classId, List<Long> counselorIds, Long primaryCounselorId);

    /**
     * 检查关联关系是否存在
     * @param counselorId 辅导员ID
     * @param classId 班级ID
     * @return 是否存在
     */
    boolean existsCounselorClass(Long counselorId, Long classId);

    /**
     * 获取辅导员负责的班级数量
     * @param counselorId 辅导员ID
     * @return 班级数量
     */
    int getClassCountByCounselorId(Long counselorId);

    /**
     * 获取班级的辅导员数量
     * @param classId 班级ID
     * @return 辅导员数量
     */
    int getCounselorCountByClassId(Long classId);

    /**
     * 获取班级的主要负责辅导员
     * @param classId 班级ID
     * @return 主要负责辅导员关联关系
     */
    CounselorClass getPrimaryCounselorByClassId(Long classId);
}